从 Completions 到 Responses:大模型 API 协议演进
随着大模型应用从“聊天机器人”发展到“AI Agent”,模型调用协议也经历了一次重要演进。从最早的文本补全 API,到 ChatGPT 时代的 Chat Completions,再到 Agent 时代的 Responses API,背后反映的是大模型应用形态的变化。
但在实际工程中,一个常见的困惑是:既然 DeepSeek、Qwen 这些模型都宣称“兼容 OpenAI API”,为什么 Codex 不能直接换上 DeepSeek?为什么 Claude Code 反而更容易适配多种模型?这其实都和三代 API 协议的差异有关。
本文总结 /v1/completions、/v1/chat/completions、/v1/responses 的区别,以及为什么 Claude Code、Codex、DeepSeek 在 API 兼容方面表现不同。
一、大模型 API 的三代演进
整体演进路径是这样的:
/v1/completions
↓
/v1/chat/completions
↓
/v1/responses这不是简单的版本升级,而是模型使用方式的变化:
文本生成
↓
聊天交互
↓
智能 Agent每一代解决的是上一代在新的应用形态下暴露出来的不足。下面分别看这三代 API。
二、第一代:/v1/completions
1. 核心思想
给模型一段文本,让模型继续补全。早期 GPT API 类似高级自动补全。
请求:
POST /v1/completions示例:
{
"model": "text-davinci-003",
"prompt": "写一个快速排序算法:"
}模型:
输入:
写一个快速排序算法:
输出:
def quick_sort(arr):
...抽象:
prompt
↓
模型
↓
completion text2. 缺点
这个阶段模型并不知道:
- 谁是用户
- 什么是系统规则
- 什么是历史消息
开发者只能手动拼 prompt:
你是代码助手
用户:
写一个函数
助手:维护困难。这一代 API 适合“单次补全”,不适合“持续对话”。
三、第二代:/v1/chat/completions
ChatGPT 时代出现。
1. 核心思想
模型不是补全文本,而是在理解一段对话。
请求:
POST /v1/chat/completions格式:
{
"messages": [
{
"role": "system",
"content": "你是代码助手"
},
{
"role": "user",
"content": "写一个排序算法"
}
]
}消息有角色:
system
user
assistant模型知道:
- 系统要求
- 用户输入
- 历史上下文
2. 优势
多轮对话
以前需要自己拼:
用户: 你好
助手: 你好
用户: 继续现在直接用消息数组表达:
messages: [
user,
assistant,
user
]Tool Calling
后来 Chat Completions 增加了对工具调用的支持:
用户
↓
模型
↓
调用函数
↓
返回结果
↓
继续回答例如模型可以返回:
{
"tool_calls": [
{
"name": "search"
}
]
}可以调用:
- 搜索
- 数据库
- API
- 文件系统
3. 影响
由于简单、生态成熟,大量模型兼容它:
DeepSeek
Qwen
Mistral
Groq
Ollama形成事实标准:
OpenAI-compatible API = chat/completions也就是说,今天说“兼容 OpenAI API”,绝大多数情况下指的就是 /v1/chat/completions 这一代。
四、第三代:/v1/responses
随着 AI Agent 出现,Chat Completions 不够用了。
因为 Agent 不只是回答问题。例如“帮我修复项目”,真实流程是这样的:
读取文件
↓
分析代码
↓
修改文件
↓
运行测试
↓
发现错误
↓
继续修复
↓
返回结果这已经不是简单聊天。于是 OpenAI 推出:
POST /v1/responses请求:
{
"model": "gpt-5",
"input": "修复我的项目",
"tools": [
{
"type": "computer"
}
]
}返回:
{
"output": [
{
"type": "tool_call"
},
{
"type": "message"
}
]
}核心变化在于抽象层级。Chat Completions 的流程是:
messages
↓
answer而 Responses 的流程是:
input
↓
reasoning
↓
tool_call
↓
tool_result
↓
message它更像一个任务执行流,而不再是“一问一答”。
五、为什么 Codex 不能直接换 DeepSeek
很多人认为:
DeepSeek 兼容 OpenAI API,所以应该可以替换 Codex。实际上不完全。原因在于协议层。
DeepSeek 主要兼容:
/v1/chat/completions而 Codex 使用:
/v1/responses两者协议不同。例如 Codex 发送:
{
"input": ["..."],
"tools": ["..."]
}但是 DeepSeek 期待:
{
"messages": ["..."]
}字段不匹配。
更重要的是,Codex 不只是调用模型。它依赖一整套 Agent 能力:
Responses API
+ Tool Calling
+ Agent Loop
+ 代码执行环境
+ 状态管理所以这里有一个关键结论:
API 兼容 ≠ Agent 兼容一个模型能在 /v1/chat/completions 上跑通,不代表它能直接支撑一个依赖 /v1/responses 的 Agent 运行时。
六、为什么 Claude Code 可以适配更多模型
这里容易误解:Claude Code 原生不是 /chat/completions。Anthropic 使用的是自己的协议:
/v1/messages但是它更容易通过 Adapter 转换。例如:
Claude Code
↓
协议转换层
↓
DeepSeek / OpenAI转换主要是字段映射:
Anthropic:
{
"messages": []
}
↓
OpenAI:
{
"messages": []
}结构接近,转换成本较低。
而 Codex 依赖的 Responses API 是一种新的 Agent 抽象:
response items
tool calls
reasoning
state要把这些映射回老的 /v1/chat/completions,转换成本要高得多。这也是为什么 Claude Code 比 Codex 更容易适配多种模型。
七、CC Switch 做了什么
CC Switch 本质是:在客户端和模型之间增加一个代理层。
架构:
Claude Code
Codex
Cursor
↓
CC Switch
↓
-----------------
| | |
GPT Claude DeepSeek它主要做三件事。
1. 配置切换
修改:
API Key
Base URL
Model
Provider让客户端无需改动,就能切换到不同模型供应商。
2. 协议转换
例如 Claude 原生走的是:
/v1/messages代理层把它转换成:
/v1/chat/completions流程:
请求
↓
解析 JSON
↓
字段转换
↓
调用目标模型
↓
转换返回
↓
返回客户端3. Tool Calling 映射
不同协议对工具调用的表达不一样,代理层负责转换。例如:
Anthropic:
{
"type": "tool_use"
}
OpenAI:
{
"type": "tool_calls"
}代理层就是处理这类字段差异。
八、/v1 为什么一直没有 v2
很多人误解:
/v1/chat/completions
/v1/responses认为 responses 是 v2。不是。
这里的 v1 表示 API 版本。下面的:
chat/completions
responses
embeddings
images是不同功能接口。类似:
/api/v1/users
/api/v1/orders它们不是版本不同,而是同一个 v1 版本下不同的资源接口。/v1/responses 和 /v1/chat/completions 同理,是并存的接口,不是新旧版本关系。
九、总结
三代接口的对应关系如下:
| 接口 | 时代 | 抽象 | 适合 |
|---|---|---|---|
| /v1/completions | GPT 早期 | 文本补全 | 生成文本 |
| /v1/chat/completions | ChatGPT 时代 | 消息对话 | 聊天助手 |
| /v1/responses | Agent 时代 | 任务执行流 | AI Agent |
核心变化用一句话概括:
Completion = 帮我写一句话
Chat Completion = 和我聊天
Responses = 帮我完成一个任务未来 AI 编程工具的发展方向,也会越来越从 Chatbot 转向 Agent。因此 API 协议也会从“文本生成协议”逐渐演进为“任务执行协议”。
这也是为什么 Codex、Claude Code、Cursor、DeepSeek 在 API 兼容策略上会出现不同路线:它们各自处在三代协议的不同位置,转换的代价天然就不一样。